﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


using DatabaseCompare.Model;
using DatabaseCompare.Service.Compare;

namespace DatabaseCompare.ServiceImpl.Compare
{


    public class TableListCompare : ICompareAbleListCompare<TableInfo, TableCompareResult>
    {
        /// <summary>
        /// 表的比较类.
        /// </summary>
        private ICompareAbleCompare<TableInfo, TableCompareResult> tableCompare = new TableCompare();


        public List<TableCompareResult> Compare(List<TableInfo> leftTableInfoList, List<TableInfo> rightTableInfoList)
        {
            // 结果表表.
            List<TableCompareResult> resultList = new List<TableCompareResult>();

            // 为避免下面的 Linq 处理异常
            // 假如 一个表的  表 的表表为 null
            // 将其设置为一个 空的表表.
            if (leftTableInfoList == null)
            {
                leftTableInfoList = new List<TableInfo>();
            }
            if (rightTableInfoList == null)
            {
                rightTableInfoList = new List<TableInfo>();
            }


            // 使用 Linq 
            // 检索两个表的 表 的并集。
            // 同时合并掉 相同的表.
            var query =
                (from table in leftTableInfoList
                 select table.Name
                    ).Union
                (from table in rightTableInfoList
                 select table.Name
                    );


            // 获取 表名 List.
            List<string> tableNameList = query.ToList();

            // 表名排序.
            tableNameList.Sort();


            // 依次比较表.
            for (int i = 0; i < tableNameList.Count; i++)
            {
                // 检索左边的表.
                var queryLeft =
                    from data in leftTableInfoList
                    where data.Name == tableNameList[i]
                    select data;

                // 检索右边的表.
                var queryRight =
                    from data in rightTableInfoList
                    where data.Name == tableNameList[i]
                    select data;


                // 表的比较结果.
                TableCompareResult tableCompareResult = null;

                if (queryLeft.Count() == 0)
                {
                    if (queryRight.Count() == 0)
                    {
                        // 左表找不到表， 右表也找不到表.
                        // 理论上这种情况不会发生.
                        tableCompareResult = tableCompare.Compare(null, null);
                    }
                    else
                    {
                        // 左表找不到表， 右表找到表.
                        tableCompareResult = tableCompare.Compare(null, queryRight.First());
                    }
                }
                else
                {
                    if (queryRight.Count() == 0)
                    {
                        // 左表找到表， 右表找不到表.
                        tableCompareResult = tableCompare.Compare(queryLeft.First(), null);
                    }
                    else
                    {
                        // 左表找到表， 右表找到表.
                        tableCompareResult = tableCompare.Compare(queryLeft.First(), queryRight.First());
                    }
                }


                // 将 表的比较结果加入最后的比较表表.
                resultList.Add(tableCompareResult);

            }

            return resultList;
        }
    }
}
